<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1. 硬编码：之前的例子，副作用域函数必须要有一个函数名，我们把它存到桶里面，后续才会调用
        // 2. 接下来，我们不要硬编码，采用一种方式改变。
        // 2.1 利用全局变量 + effect函数修改为(副作用域函数赋值给全局变量 + 执行副作用域函数 => 执行以后呢 副作用域函数就和obj.text进行了绑定)
        let data = { text: '123' }
        let bucket = new Set()
        let activeAffect
        function effect(fn) {
            // 把副作用函数存储给 activeAffect
            activeAffect = fn
            // 执行副作用函数
            fn()
        }
        let obj = new Proxy(data, {
            get(target, key) {
                bucket.add(activeAffect)
                return target[key]
            },
            set(target, key, newVal) {
                target[key] = newVal
                bucket.forEach(fn => fn())
                return true
            }
        })
        effect(
            () => {
                document.body.innerHTML = obj.text
            }
        )
        obj.text = '456'
    </script>
</body>

</html>